#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>

#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>

#include <string>
#include <unistd.h>
#include "task.hpp"
class Server
{
public:
    Server(int port)
        : _port(port), _isrunning(false)
    {
        /*打开套接字*/
        _listenfd = socket(AF_INET, SOCK_STREAM, 0);
        if (_listenfd < 0)
        {
            perror("socket");
            exit(1);
        }
        else
        {
            std::cout << "socket success" << std::endl;
        }
        /*绑定端口*/
        sockaddr_in server_addr;
        server_addr.sin_family = AF_INET; // 设置为IPv4
        // 主机序列->网络序列
        server_addr.sin_port = htons(_port);
        server_addr.sin_addr.s_addr = INADDR_ANY;
        int n = bind(_listenfd, (sockaddr *)&server_addr, sizeof(server_addr));
        if (n < 0)
        {
            perror("bind");
            exit(1);
        }
        else
        {
            std::cout << "bind success" << std::endl;
        }

        /*打开监听*/
        static const int backlog = 10; // 允许10个客户端连接
        n = listen(_listenfd, backlog);
        if (n < 0)
        {
            perror("listen");
            exit(1);
        }
        else
        {
            std::cout << "listen success" << std::endl;
        }
    }
    void Run()
    {
        _isrunning = true;
        while (_isrunning)
        {
            sockaddr_in client_addr;
            socklen_t len = sizeof(client_addr);
            int socketfd = accept(_listenfd, (sockaddr *)&client_addr, &len);
            if (socketfd < 0)
            {
                perror("accept");
                exit(1);
            }
            else
            {
                std::cout << "accept success add: " << socketfd << std::endl;
            }
            pid_t pid = fork();
            if (pid < 0)
            {
                std::cout << "fork fail socketfd: " << socketfd << std::endl;
                continue;
            }
            else if (pid == 0)
            {
                close(_listenfd);
                if (fork() > 0)
                    exit(0);
                Task tk(socketfd);
                tk.task();
                // work(socketfd);
                exit(0);
            }
            else
            {
                close(socketfd);
            }
        }
        _isrunning = false;
    }
    // void work(int sockfd)
    // {
    //     while (true)
    //     {
    //         char buffer[1024];
    //         int n = recv(sockfd, buffer, sizeof(buffer) - 1, 0);
    //         if (n < 0)
    //         {
    //             // 异常处理
    //             perror("recv");
    //             close(sockfd);
    //             exit(1);
    //         }
    //         else if (n == 0)
    //         {
    //             // 客户端退出
    //             close(sockfd);
    //             return;
    //         }
    //         else
    //         {
    //             //新进程
    //             buffer[n] = '\0';
    //             std::cout << "Client Say@ " << buffer;
    //         }
    //     }
    // }
    ~Server()
    {
    }

private:
    uint16_t _port;
    int _listenfd;
    bool _isrunning;
};